
package com.nike.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * 日期
 * @author wb-wuhantao
 *
 */
public class DateUtils {
	
	/** 完整时间：yyyy-MM-dd HH:mm:ss */
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /** 无时分秒：yyyy-MM-dd */
    public static final String DATE_FORMAT_NO_HOUR = "yyyy-MM-dd";

    /** 年月日时分秒(无下划线)：yyyyMMddHHmmss */
    public static final String LONG_DATE_FORMAT    = "yyyyMMddHHmmss";

    /** 无日无时分秒：yyyyMM */
    public static final String DATE_FORMAT_NO_DAY  = "yyyyMM";
    /** 无年月日: HH:mm:ss */
    public static final String TIME_FORMAT_NO_DAY  = "HH:mm:ss";
	public static String now() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(new Date());
	}
	
	public static String DateString() {
		SimpleDateFormat dateSdf = new SimpleDateFormat("yyyyMMdd");
		return dateSdf.format(new Date());
	}
	
	public static String format(Date date) {
		if (null == date)
			return null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		return sdf.format(date);
	}
	
	

    /**
     * 通过格式化字符串获取format对象
     * 
     * <p>
     * 格式：<code>"yyyy-MM-dd HH:mm"</code>
     * </p>
     * 
     * @param format
     *            格式化字符串
     * 
     * @return DateFormat format对象
     */
    public static final DateFormat getFormat(String format) {
        return new SimpleDateFormat(format);
    }

    /**
     * 
     * 将日期格式字符串转换为日期时间
     * @param date 
     * @param Date date 
     * @param stringDate
     *            时间格式字符串 格式：<code>yyyy-MM-dd</code>
     * 
     * @return 日期时间 字符串空返回<code>null</code>，异常返回<code>null</code>
     * 
     * @throws Exception
     *             如果格式不匹配转换异常，返回空
     */
    public static final String getSimpleFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(DATE_FORMAT_NO_HOUR).format(date);
    }

    /**
     * 将日期对象<code>Date</code>转换为字符串类型输出。
     * 
     * <p>
     * <code>DateUtils.simpleFormat(new Date()) = "2014-11-17 18:00:00"</code>
     * </p>
     * 
     * @param date
     *            日期对象
     * 
     * @return String 输出的字符串 格式：<code>yyyy-MM-dd HH:mm:ss</code>
     */
    public static final String simpleFormat(Date date) {
        if (date == null) {
            return "";
        }

        return getFormat(DEFAULT_DATE_FORMAT).format(date);
    }

    /**
     * 将日期对象<code>Date</code>装换为字符串类型输出
     * 
     * <p>
     * <code>DateUtils.longDateFormat(new Date()) = "20141117180000"
     * </p>
     * 
     * @param date
     *            日期对象
     * 
     * @return 输出的字符串 格式：<code>yyyyMM</code>
     */
    public static final String noDayDateFormat(Date date) {
        if (date == null) {
            return "";
        }

        return getFormat(DATE_FORMAT_NO_DAY).format(date);
    }
    /**
     * 将日期对象<code>Date</code>装换为字符串类型输出
     * 
     * <p>
     * <code>DateUtils.longDateFormat(new Date()) = "format"
     * </p>
     * 
     * @param date
     *            日期对象
     * @param format 日期格式化
     * @return 输出的字符串 格式：<code>format</code>
     */
    public static final String DateFormat(Date date,String format) {
        if (date == null) {
            return "";
        }

        return getFormat(format).format(date);
    }

    /**
     * 将日期对象<code>Date</code>装换为字符串类型输出
     * 
     * <p>
     * <code>DateUtils.longDateFormat(new Date()) = "20141117180000"
     * </p>
     * 
     * @param date
     *            日期对象
     * 
     * @return 输出的字符串 格式：<code>yyyyMMddHHmmss</code>
     */
    public static final String longDateFormat(Date date) {
        if (date == null) {
            return "";
        }

        return getFormat(LONG_DATE_FORMAT).format(date);
    }

    /**
     * 将日期对象<code>Date</code>装换为字符串类型输出
     * 
     * @param date
     *            日期对象
     * 
     * @return 输出的字符串 格式：<code>HH:mm:ss</code>
     */
    public static final String timeDateFormat(Date date) {
        if (date == null) {
            return "";
        }

        return getFormat(TIME_FORMAT_NO_DAY).format(date);
    }

    /**
     * 将日期格式字符串转换为日期时间
     * 
     * <p>
     * <code>DateUtils.string2DateTime("2014-11-17 18:00:00") = Date</code>
     * </p>
     * 
     * @param stringDate
     *            时间格式字符串 格式：<code>yyyy-MM-dd HH:mm:ss</code>
     * 
     * @return 日期时间 字符串空返回<code>null</code>，异常返回<code>null</code>
     * 
     * @throws Exception
     *             如果格式不匹配转换异常，返回空
     */
    public static final Date string2DateTime(String stringDate) {

        if (!StringUtils.isNotBlank(stringDate)) {
            return null;
        }

        try {
            return getFormat(DEFAULT_DATE_FORMAT).parse(stringDate);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 将日期格式字符串转换为日期时间
     * 
     * <p>
     * <code>DateUtils.string2Date("2014-11-17") = Date</code>
     * </p>
     * 
     * @param stringDate
     *            时间格式字符串 格式：<code>yyyy-MM-dd</code>
     * 
     * @return 日期时间 字符串空返回<code>null</code>，异常返回<code>null</code>
     * 
     * @throws Exception
     *             如果格式不匹配转换异常，返回空
     */
    public static final Date string2DateNoHour(String stringDate) {

    	if (!StringUtils.isNotBlank(stringDate)) {
            return null;
        }

        try {
            return getFormat(DATE_FORMAT_NO_HOUR).parse(stringDate);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取日期加减(秒)的日期
     * 
     * <p>
     * <code>DateUtils.getDiffSecondDateTime(2014-11-17 18:00:05,1)  = 2014-11-17 18:00:06</code>
     * <code>DateUtils.getDiffSecondDateTime(2014-11-17 18:00:05,-1) = 2014-11-17 18:00:04</code>
     * </p>
     * @param date 
     * 
     * @param diffSecond
     *            差异多少秒
     * @return 计算后日期
     */
    public static final Date getDiffSecondDateTime(Date date, int diffSecond) {

        Calendar c = Calendar.getInstance();

        c.setTime(date);
        c.add(Calendar.SECOND, diffSecond);

        return c.getTime();
    }

    /**
     * 将"yyyy-MM-dd HH:mm:ss"格式的字符串转换为日期
     * 
     * @param formatString
     *            日期格式字符串
     * @return 日期对象
     */
    public static final Date formatStringToDate(String formatString) {
        if (null == formatString) {
            return null;
        }
        try {
            DateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
            return format.parse(formatString);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 将"yyyyMMddHHmmss"格式的字符串转换为日期
     * 
     * @param formatString
     *            日期格式字符串
     * @return 日期对象
     */
    public static final Date formatLongToDate(String formatString) {
        if (null == formatString) {
            return null;
        }
        try {
            DateFormat format = new SimpleDateFormat(LONG_DATE_FORMAT);
            return format.parse(formatString);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 根据当前日期计算出与当前日期间隔天数的日期
     * @param currentDate 
     * @param day 
     * @return Date
     */
    public static Date rollDateByDay(Date currentDate, int day) {
        Calendar calendar = GregorianCalendar.getInstance(Locale.getDefault());
        if (currentDate != null) {
            calendar.setTime(currentDate);
        }
        calendar.add(Calendar.DATE, day);
        return new Date(calendar.getTime().getTime());
    }

    /**
     * 根据当前日期计算出与当前日期间隔周数的日期
     * 
     * @param currentDate
     * @param week
     * @return Date
     */
    public static Date rollDateByWeek(Date currentDate, int week) {
        Calendar calendar = GregorianCalendar.getInstance(Locale.getDefault());
        if (currentDate != null) {
            calendar.setTime(currentDate);
        }
        calendar.add(Calendar.WEDNESDAY, week);
        return new Date(calendar.getTime().getTime());
    }

    /**
     * 根据当前日期计算出与当前日期间隔月数的日期
     * 
     * @param currentDate
     * @param month
     * @return Date
     */
    public static Date rollDateByMonth(Date currentDate, int month) {
        Calendar calendar = GregorianCalendar.getInstance(Locale.getDefault());
        if (currentDate != null) {
            calendar.setTime(currentDate);
        }
        calendar.add(Calendar.MONTH, month);
        return new Date(calendar.getTime().getTime());
    }

    /**
     * 根据当前日期计算出与当前日期间隔年数的日期
     * 
     * @param currentDate
     * @param year
     * @return Date
     */
    public static Date rollDateByYear(Date currentDate, int year) {
        Calendar calendar = GregorianCalendar.getInstance(Locale.getDefault());
        if (currentDate != null) {
            calendar.setTime(currentDate);
        }
        calendar.add(Calendar.YEAR, year);
        return new Date(calendar.getTime().getTime());
    }

    /**
     * 时间比较
     * 
     * @param date1
     *            第一个时间参数long型
     * @param date2
     *            第二个时间参数long型
     * @return 第一个参数大，返回正数差值</br> 第二个参数大，返回负数差值</br> 单位是秒</br>
     */
    public static final long dateCompare(long date1, long date2) {
        long mins = 0;
        Date d1 = new Date(date1);
        Date d2 = new Date(date2);
        long diff = d1.getTime() - d2.getTime();
        mins = diff / (1000);
        return mins;
    }

}
